package com.lhf.novel.sysuser.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lhf.novel.sysuser.dao.SysRoleDao;
import com.lhf.novel.sysuser.dao.SysRolePerDao;
import com.lhf.novel.sysuser.entity.SysRole;
import com.lhf.novel.sysuser.service.SysRoleService;
import com.lhf.novel.sysuser.vo.SysRoleInfoVo;
import com.lhf.novel.sysuser.vo.SysRoleListVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * (SysRole)表服务实现类
 *
 * @author 刘会发
 * @since 2020-03-09 11:20:00
 */
@Service("sysRoleService")
public class SysRoleServiceImpl implements SysRoleService {
    @Resource
    private SysRoleDao sysRoleDao;
    @Resource
    private SysRolePerDao sysRolePerDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public SysRoleInfoVo queryById(Integer id) {
        return this.sysRoleDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<SysRole> queryAllByLimit(int offset, int limit) {
        return this.sysRoleDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param sysRole 实例对象
     * @return 实例对象
     */
    @Override
    @Transactional
    public SysRole insert(SysRole sysRole, String jsonPids) {
        this.sysRoleDao.insert(sysRole);
        JSONArray jsonArray = JSONArray.parseArray(jsonPids);
        if (jsonArray.size() > 0)
            sysRolePerDao.insert(sysRole.getId(), jsonArray.toArray(new Integer[jsonArray.size()]));
        return sysRole;
    }

    /**
     * 修改数据
     *
     * @param sysRole 实例对象
     * @return 实例对象
     */
    @Override
    @Transactional
    public int update(SysRole sysRole, String jsonPids) throws IllegalAccessException {
        if (sysRole.getIsDel() == null && StringUtils.isBlank(sysRole.getRole()) && StringUtils.isBlank(sysRole.getRoleIco()) && StringUtils.isBlank(sysRole.getRoleName()))
            throw new IllegalAccessException("至少修改一个参数");
        if (jsonPids != null) {
            JSONArray jsonArray = JSONArray.parseArray(jsonPids);
            if (jsonArray.size() == 0)
                throw new IllegalAccessException("至少有一个权限");
            sysRolePerDao.insert(sysRole.getId(), jsonArray.toArray(new Integer[jsonArray.size()]));
        }
        this.sysRoleDao.update(sysRole);
        return 1;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.sysRoleDao.deleteById(id) > 0;
    }

    /**
     * <p>条件查询角色列表</p>
     *
     * @param roleName 角色名字
     * @param role     角色
     * @param pageNum  页码
     * @param pageSize 每页展示数量
     * @return
     */
    @Override
    public PageInfo<SysRoleListVo> queryAll(String roleName, String role, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return PageInfo.of(sysRoleDao.queryAll(new SysRole(roleName, role, null)));
    }

    /**
     * <p>角色授权</p>
     *
     * @param rid     角色id
     * @param pidJson 权限id数组
     * @return
     */
    @Override
    public int authorization(Integer rid, String pidJson) {
        JSONArray objects = JSONArray.parseArray(pidJson);
        sysRolePerDao.insert(rid, objects.toArray(new Integer[objects.size()]));
        return 1;
    }
}